// #include <stdio.h>
// #include <stdlib.h>
// #include <stdbool.h>
// #include "windows.h"
//
// typedef int DataType;
//
// typedef struct TreeNode {
//     DataType value;
//     struct TreeNode* left;
//     struct TreeNode* right;
// } TreeNode;
//
// typedef struct TLNode {
//     TreeNode* data;
//     struct TLNode* next;
// }TLNode;
//
// typedef struct TreeLinkList {
//     TLNode* head;
// }TLL;
//
// void InitTLL(TLL* list) {
//     list->head=NULL;
// }
//
// //将树节点放入类型为TLNode的节点中
// TLNode* CreatTLNode(TreeNode* data) {
//     TLNode* newNode=(TLNode*)malloc(sizeof(TLNode));
//     if(newNode==NULL) {
//         exit(1);
//     }
//     newNode->data=data;
//     newNode->next=NULL;
//     return newNode;
// }
//
// // 创建树的新节点
// TreeNode* CreateNode(DataType value) {
//     TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
//     if (newNode == NULL) {
//         perror("Memory allocation failed");
//         exit(EXIT_FAILURE);
//     }
//     newNode->value = value;
//     newNode->left = newNode->right = NULL;
//     return newNode;
// }
//
// // 插入节点（二叉搜索树规则）
// TreeNode* InsertNode(TreeNode* root, DataType x) {
//     if (root == NULL) {
//         return CreateNode(x);
//     }
//     if (x < root->value) {
//         root->left = InsertNode(root->left, x);
//     } else {
//         root->right = InsertNode(root->right, x);
//     }
//     return root;
// }
//
// // 释放内存
// void FreeTree(TreeNode* root) {
//     if (root) {
//         FreeTree(root->left);
//         FreeTree(root->right);
//         free(root);
//     }
// }
//
// //将一个二叉树的叶子节点从左到右连成一个单链表
// //思路：基于先序得到叶节点的从左到右的顺序，TLL链表的头结点指向第一个叶子，
// void DDD(TLL* L,TreeNode* root) {
//     if(root==NULL) {
//         return;
//     }
//     if(root->left==NULL&&root->right==NULL) {
//         TLNode* newNode=CreatTLNode(root);
//         if(L->head==NULL) {
//             L->head=newNode;
//         }else {
//             TLNode* node=L->head;
//             while (node->next!=NULL) {
//                 node=node->next;
//             }
//             node->next=newNode;
//         }
//         return;
//     }
//     DDD(L,root->left);
//     DDD(L,root->right);
// }
//
// //打印此链表
// void PrintTLL(TLL* L) {
//     if(L==NULL) {
//         return;
//     }
//     TLNode* p=L->head;
//     while (p!=NULL) {
//         printf("%d ",p->data->value);
//         p=p->next;
//     }
//     printf("\n");
// }
//
// //释放此链表
// void FreeTLL(TLL* L) {
//     TLNode* current = L->head;
//     while (current != NULL) {
//         TLNode* temp = current;
//         current = current->next;
//         free(temp);
//     }
//     L->head = NULL;
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     TreeNode* root = NULL;
//     int values[] = {50, 30, 70, 20, 40, 60, 80};
//     int length = sizeof(values) / sizeof(values[0]);
//
//     // 构建二叉搜索树
//     for (int i = 0; i < length; i++) {
//         root = InsertNode(root, values[i]);
//     }
//
//     TLL L;
//     InitTLL(&L);
//     DDD(&L,root);
//
//     PrintTLL(&L);
//
//     FreeTree(root);
//     FreeTLL(&L);
//     return 0;
// }